package arithmetic;

import java.util.Scanner;

/**
 * 知识点：
 * 1.一个数总能写成“n = a * b”的形式，a和b之间一定有一个数不大于n/2
 * 2.质数：又称素数。指在一个大于1的自然数中，除了1和此整数自身外，没法被其他自然数整除的数。
 * 3.一个整数的因子是质数，则该质数被成为质因子；
 *
 * 描述
 * 功能:输入一个正整数，按照从小到大的顺序输出它的所有质因子（重复的也要列举）（如180的质因子为2 2 3 3 5 ）
 *
 *
 * 数据范围：1≤n≤2×10^9+14
 * 输入描述：
 * 输入一个整数
 *
 * 输出描述：
 * 按照从小到大的顺序输出它的所有质数的因子，以空格隔开。
 *
 * 示例1
 * 输入：
 * 180
 * 复制
 * 输出：
 * 2 2 3 3 5
 */
public class TestHW6 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        try{
            int num = in.nextInt();
            if(num>=1 && num<=2000000014){
                test(num);
            }else{
                System.out.println("请输入范围在1到2000000014之间的正整数");
            }
        }catch(Exception e){
            System.out.println("非法输入，请输入范围在1到2000000014之间的正整数");
        }
    }

    public static void test(int num){
        //正整数1不存在质因子
        if(num==1)return;
        test2(num);

    }
    //输出质因数
    public static void test2(int num){
        int n1 = 0;
        if(2>num/2){
            System.out.print(num);
            return;
        }
        for(int i=2; i<=num/2; i++){
            if(num%i==0){
                System.out.print(i+" ");
                n1 = num / i;
                break;
            }
            if(i == num/2){
                System.out.print(num);
                return;
            }
        }
        test2(n1);
    }

    // //判断一个数是否是质数，如果是，则返回true；
    // public static boolean judge(int num1){
    //         boolean f = false;
    //         for(int i = 2; i < num1/2; i++){
    //             f = num1 % i == 0;
    //             if(f){
    //                 break;
    //             }
    //         }
    //         return f?false:true;
    // }
}
